--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/frontend/libs/datetime.js b0d47b9ece2aac27f9b52d71eead961754287bf5 (b0d47b9e) Text, 8.29 KB
T8b949e// SPDX-License-Identifier: 0BSD
T8b949e/**
* Local datetime helpers for MeshChatX.
* formatDate supports a frozen token subset. fromNow uses a frozen English golden table.
*/
Tff7b72export Tff7b72const Te6edf3MONTHS_SHORT Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[
Ta5d6ff"Jan"Tb4b4b4,
Ta5d6ff"Feb"Tb4b4b4,
Ta5d6ff"Mar"Tb4b4b4,
Ta5d6ff"Apr"Tb4b4b4,
Ta5d6ff"May"Tb4b4b4,
Ta5d6ff"Jun"Tb4b4b4,
Ta5d6ff"Jul"Tb4b4b4,
Ta5d6ff"Aug"Tb4b4b4,
Ta5d6ff"Sep"Tb4b4b4,
Ta5d6ff"Oct"Tb4b4b4,
Ta5d6ff"Nov"Tb4b4b4,
Ta5d6ff"Dec"Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
T8b949e/** Tokens accepted by formatDate. Unknown tokens stay literal. */
Tff7b72export Tff7b72const Te6edf3SUPPORTED_FORMAT_TOKENS Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[
Ta5d6ff"YYYY"Tb4b4b4,
Ta5d6ff"MMM"Tb4b4b4,
Ta5d6ff"MM"Tb4b4b4,
Ta5d6ff"M"Tb4b4b4,
Ta5d6ff"DD"Tb4b4b4,
Ta5d6ff"D"Tb4b4b4,
Ta5d6ff"HH"Tb4b4b4,
Ta5d6ff"H"Tb4b4b4,
Ta5d6ff"hh"Tb4b4b4,
Ta5d6ff"h"Tb4b4b4,
Ta5d6ff"mm"Tb4b4b4,
Ta5d6ff"A"Tb4b4b4,
Ta5d6ff"a"Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3TOKEN_RE Tff7b72= Ta5d6ff/YYYY|MMM|MM|M|DD|D|HH|H|hh|h|mm|A|a/gTb4b4b4;
T8b949e/**
* Frozen relative-time thresholds. Do not change without updating golden tests.
* limitSec is inclusive upper bound for the absolute second delta.
*/
Tff7b72export Tff7b72const Te6edf3FROM_NOW_THRESHOLDS Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff44Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"a few seconds ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in a few seconds" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff89Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"a minute ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in a minute" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff44 Tff7b72* T79c0ff60Tb4b4b4, Te6edf3unitSecTff7b72: T79c0ff60Tb4b4b4, Te6edf3unitTff7b72: Ta5d6ff"minute" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff89 Tff7b72* T79c0ff60Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"an hour ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in an hour" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff21 Tff7b72* T79c0ff3600Tb4b4b4, Te6edf3unitSecTff7b72: T79c0ff3600Tb4b4b4, Te6edf3unitTff7b72: Ta5d6ff"hour" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff35 Tff7b72* T79c0ff3600Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"a day ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in a day" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff25 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3unitSecTff7b72: T79c0ff86400Tb4b4b4, Te6edf3unitTff7b72: Ta5d6ff"day" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff45 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"a month ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in a month" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff10 Tff7b72* T79c0ff30 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3unitSecTff7b72: T79c0ff30 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3unitTff7b72: Ta5d6ff"month" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: T79c0ff17 Tff7b72* T79c0ff365 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3pastTff7b72: Ta5d6ff"a year ago"Tb4b4b4, Te6edf3futureTff7b72: Ta5d6ff"in a year" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4{ Te6edf3limitSecTff7b72: Tffa657NumberTb4b4b4.Te6edf3POSITIVE_INFINITYTb4b4b4, Te6edf3unitSecTff7b72: T79c0ff365 Tff7b72* T79c0ff86400Tb4b4b4, Te6edf3unitTff7b72: Ta5d6ff"year" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
T8b949e/**
* Golden samples for fromNow. Kept next to the implementation so drift is obvious.
* Each entry: [deltaSec, expectedPast, expectedFuture]
*/
Tff7b72export Tff7b72const Te6edf3FROM_NOW_GOLDEN Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff0Tb4b4b4, Ta5d6ff"a few seconds ago"Tb4b4b4, Ta5d6ff"a few seconds ago"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff1Tb4b4b4, Ta5d6ff"a few seconds ago"Tb4b4b4, Ta5d6ff"in a few seconds"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff44Tb4b4b4, Ta5d6ff"a few seconds ago"Tb4b4b4, Ta5d6ff"in a few seconds"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff45Tb4b4b4, Ta5d6ff"a minute ago"Tb4b4b4, Ta5d6ff"in a minute"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff89Tb4b4b4, Ta5d6ff"a minute ago"Tb4b4b4, Ta5d6ff"in a minute"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff90Tb4b4b4, Ta5d6ff"2 minutes ago"Tb4b4b4, Ta5d6ff"in 2 minutes"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff120Tb4b4b4, Ta5d6ff"2 minutes ago"Tb4b4b4, Ta5d6ff"in 2 minutes"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff44 Tff7b72* T79c0ff60Tb4b4b4, Ta5d6ff"44 minutes ago"Tb4b4b4, Ta5d6ff"in 44 minutes"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff45 Tff7b72* T79c0ff60Tb4b4b4, Ta5d6ff"an hour ago"Tb4b4b4, Ta5d6ff"in an hour"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff89 Tff7b72* T79c0ff60Tb4b4b4, Ta5d6ff"an hour ago"Tb4b4b4, Ta5d6ff"in an hour"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff90 Tff7b72* T79c0ff60Tb4b4b4, Ta5d6ff"2 hours ago"Tb4b4b4, Ta5d6ff"in 2 hours"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff21 Tff7b72* T79c0ff3600Tb4b4b4, Ta5d6ff"21 hours ago"Tb4b4b4, Ta5d6ff"in 21 hours"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff22 Tff7b72* T79c0ff3600Tb4b4b4, Ta5d6ff"a day ago"Tb4b4b4, Ta5d6ff"in a day"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff35 Tff7b72* T79c0ff3600Tb4b4b4, Ta5d6ff"a day ago"Tb4b4b4, Ta5d6ff"in a day"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff36 Tff7b72* T79c0ff3600Tb4b4b4, Ta5d6ff"2 days ago"Tb4b4b4, Ta5d6ff"in 2 days"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff2 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"2 days ago"Tb4b4b4, Ta5d6ff"in 2 days"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff25 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"25 days ago"Tb4b4b4, Ta5d6ff"in 25 days"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff26 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"a month ago"Tb4b4b4, Ta5d6ff"in a month"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff45 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"a month ago"Tb4b4b4, Ta5d6ff"in a month"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff46 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"2 months ago"Tb4b4b4, Ta5d6ff"in 2 months"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff10 Tff7b72* T79c0ff30 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"10 months ago"Tb4b4b4, Ta5d6ff"in 10 months"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff11 Tff7b72* T79c0ff30 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"a year ago"Tb4b4b4, Ta5d6ff"in a year"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff17 Tff7b72* T79c0ff365 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"a year ago"Tb4b4b4, Ta5d6ff"in a year"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657ObjectTb4b4b4.Te6edf3freezeTb4b4b4(Tb4b4b4[T79c0ff18 Tff7b72* T79c0ff365 Tff7b72* T79c0ff86400Tb4b4b4, Ta5d6ff"18 years ago"Tb4b4b4, Ta5d6ff"in 18 years"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
T8b949e/**
* @param {unknown} input
* @returns {Date | null}
*/
Tff7b72export Tff7b72function Te6edf3toDateTb4b4b4(Te6edf3inputTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3input Tff7b72== Tff7b72null Tff7b72|| Te6edf3input Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3input Tff7b72instanceof Tffa657DateTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3t Tff7b72= Te6edf3inputTb4b4b4.Te6edf3getTimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3tTb4b4b4) Tff7b72? Te6edf3input Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3input Tff7b72=== Ta5d6ff"number"Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3d Tff7b72= Tff7b72new Tffa657DateTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3dTb4b4b4.Te6edf3getTimeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72? Te6edf3d Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3input Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3d Tff7b72= Tff7b72new Tffa657DateTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3dTb4b4b4.Te6edf3getTimeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72? Te6edf3d Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {Date} date
* @param {string} token
* @returns {string}
*/
Tff7b72function Te6edf3formatTokenTb4b4b4(Te6edf3dateTb4b4b4, Te6edf3tokenTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3month Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getMonthTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3day Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getDateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hours24 Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getHoursTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3minutes Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getMinutesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3year Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getFullYearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hours12 Tff7b72= Te6edf3hours24 Tff7b72% T79c0ff12 Tff7b72|| T79c0ff12Tb4b4b4;
Tff7b72const Te6edf3ampm Tff7b72= Te6edf3hours24 Tff7b72< T79c0ff12 Tff7b72? Ta5d6ff"AM" Tff7b72: Ta5d6ff"PM"Tb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3tokenTb4b4b4) Tb4b4b4{
Tff7b72case Ta5d6ff"YYYY"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3yearTb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff4Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"MMM"Tff7b72:
Tff7b72return Te6edf3MONTHS_SHORTTb4b4b4[Te6edf3monthTb4b4b4]Tb4b4b4;
Tff7b72case Ta5d6ff"MM"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3month Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"M"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3month Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"DD"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3dayTb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"D"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3dayTb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"HH"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3hours24Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"H"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3hours24Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"hh"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3hours12Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"h"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3hours12Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"mm"Tff7b72:
Tff7b72return Tffa657StringTb4b4b4(Te6edf3minutesTb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tff7b72case Ta5d6ff"A"Tff7b72:
Tff7b72return Te6edf3ampmTb4b4b4;
Tff7b72case Ta5d6ff"a"Tff7b72:
Tff7b72return Te6edf3ampmTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72defaultTff7b72:
Tff7b72return Te6edf3tokenTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* True when every format token in pattern is in SUPPORTED_FORMAT_TOKENS.
* Literals and punctuation are ignored.
*
* @param {unknown} pattern
* @returns {boolean}
*/
Tff7b72export Tff7b72function Te6edf3isSupportedFormatPatternTb4b4b4(Te6edf3patternTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3pattern Tff7b72!== Ta5d6ff"string" Tff7b72|| Te6edf3patternTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3matches Tff7b72= Te6edf3patternTb4b4b4.Te6edf3matchTb4b4b4(Te6edf3TOKEN_RETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3matchesTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3matchesTb4b4b4.Te6edf3everyTb4b4b4(Tb4b4b4(Te6edf3tokenTb4b4b4) Tb4b4b4=> Te6edf3SUPPORTED_FORMAT_TOKENSTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3tokenTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Format a date with the frozen token subset.
* Supported: YYYY MMM MM M DD D HH H hh h mm A a
*
* @param {unknown} input
* @param {string} pattern
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3formatDateTb4b4b4(Te6edf3inputTb4b4b4, Te6edf3patternTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3date Tff7b72= Te6edf3toDateTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3date Tff7b72|| Tff7b72typeof Te6edf3pattern Tff7b72!== Ta5d6ff"string" Tff7b72|| Te6edf3patternTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3patternTb4b4b4.Te6edf3replaceTb4b4b4(Te6edf3TOKEN_RETb4b4b4, Tb4b4b4(Te6edf3tokenTb4b4b4) Tb4b4b4=> Te6edf3formatTokenTb4b4b4(Te6edf3dateTb4b4b4, Te6edf3tokenTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {string} unit
* @param {number} n
* @param {boolean} isFuture
* @returns {string}
*/
Tff7b72function Te6edf3pluralUnitLabelTb4b4b4(Te6edf3unitTb4b4b4, Te6edf3nTb4b4b4, Te6edf3isFutureTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3word Tff7b72= Te6edf3n Tff7b72=== T79c0ff1 Tff7b72? Te6edf3unit Tff7b72: Ta5d6ff`Tffd700${Te6edf3unitTffd700}Ta5d6ffsTa5d6ff`Tb4b4b4;
Tff7b72return Te6edf3isFuture Tff7b72? Ta5d6ff`Ta5d6ffin Tffd700${Te6edf3nTffd700}Ta5d6ff Tffd700${Te6edf3wordTffd700}Ta5d6ff` Tff7b72: Ta5d6ff`Tffd700${Te6edf3nTffd700}Ta5d6ff Tffd700${Te6edf3wordTffd700}Ta5d6ff agoTa5d6ff`Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Pure relative label from absolute seconds and polarity.
*
* @param {number} absSec
* @param {boolean} isFuture
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3relativeLabelTb4b4b4(Te6edf3absSecTb4b4b4, Te6edf3isFutureTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3sec Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Tffa657NumberTb4b4b4(Te6edf3absSecTb4b4b4) Tff7b72|| T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3row Tff7b72of Te6edf3FROM_NOW_THRESHOLDSTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sec Tff7b72> Te6edf3rowTb4b4b4.Te6edf3limitSecTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3rowTb4b4b4.Te6edf3unitTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3n Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Te6edf3sec Tff7b72/ Te6edf3rowTb4b4b4.Te6edf3unitSecTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3pluralUnitLabelTb4b4b4(Te6edf3rowTb4b4b4.Te6edf3unitTb4b4b4, Te6edf3nTb4b4b4, Te6edf3isFutureTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3sec Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3rowTb4b4b4.Te6edf3pastTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3isFuture Tff7b72? Te6edf3rowTb4b4b4.Te6edf3future Tff7b72: Te6edf3rowTb4b4b4.Te6edf3pastTb4b4b4;
Tb4b4b4}
T8b949e// FROM_NOW_THRESHOLDS always ends at Infinity. Kept as a safety net.
Tff7b72return Te6edf3isFuture Tff7b72? Ta5d6ff"in a few seconds" Tff7b72: Ta5d6ff"a few seconds ago"Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Relative time string from `input` toward `now` (default Date.now()).
*
* @param {unknown} input
* @param {unknown} [nowInput]
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3fromNowTb4b4b4(Te6edf3inputTb4b4b4, Te6edf3nowInput Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3date Tff7b72= Te6edf3toDateTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3now Tff7b72= Te6edf3toDateTb4b4b4(Te6edf3nowInputTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3date Tff7b72|| Tff7b72!Te6edf3nowTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3diffMs Tff7b72= Te6edf3dateTb4b4b4.Te6edf3getTimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3nowTb4b4b4.Te6edf3getTimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3absSec Tff7b72= Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Tffa657MathTb4b4b4.Te6edf3absTb4b4b4(Te6edf3diffMsTb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3isFuture Tff7b72= Te6edf3diffMs Tff7b72> T79c0ff0Tb4b4b4;
Tff7b72return Te6edf3relativeLabelTb4b4b4(Te6edf3absSecTb4b4b4, Te6edf3isFutureTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* dayjs-like helper for call sites that previously did dayjs(x).format / .fromNow.
*
* @param {unknown} input
*/
Tff7b72export Tff7b72function Te6edf3meshDateTb4b4b4(Te6edf3inputTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3formatTb4b4b4(Te6edf3patternTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3formatDateTb4b4b4(Te6edf3inputTb4b4b4, Te6edf3patternTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3fromNowTb4b4b4(Te6edf3nowInputTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3fromNowTb4b4b4(Te6edf3inputTb4b4b4, Te6edf3nowInputTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3toDateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3toDateTb4b4b4(Te6edf3inputTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────